/*
    封装一个SqliteHelper类，提供简单的数据库操作结构，以及数据的增删改查操作
    1.数据库文件的打开/创建
    2.针对打开的数据库进行操作
      表的操作
      数据的操作
    3.数据库的关闭
*/

#include <sqlite3.h>
#include <functional>
#include <iostream>
#include <string>

class SqliteHelper
{
private:
    typedef int(*SqliteCallback)(void*, int, char **, char **);
    std::string _dbfile; // 数据库文件
    sqlite3 *_handler;   // 数据库操作句柄
public:
    SqliteHelper(const std::string &dbfile) : _dbfile(dbfile), _handler(nullptr) {}

    // 打开/创建数据库文件
    bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX)
    {
        // int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_leve, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "创建/打开sqlite数据库失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    bool exec(const std::string &sql,SqliteCallback cb,void *arg)
    {
        int ret = sqlite3_exec(_handler, sql.c_str(),cb,arg,nullptr);
        if(ret != SQLITE_OK){
            std::cout << sql << std::endl;
            std::cout << "执行语句失败: ";
            std::cout << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    void close()
    {
        if(_handler) sqlite3_close_v2(_handler);
    }
};